<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        class Observer {
            constructor(code) {
                this.code = code;
            }
            update() {
                console.log('我是：', this.code, '我知道我该更新了')
            }
        }

        class Suject {
            constructor() {
                this.observerList = [];
            }

            addObserver(observer) {
                this.observerList.push(observer)
            }

            notify() {
                this.observerList.map((observer) => observer.update())
            }
        }

        // 具体的观察者
        const concreteObservver1 = new Observer('concreteObservver1');
        const concreteObservver2 = new Observer('concreteObservver2');
        const concreteObservver3 = new Observer('concreteObservver3');
        const concreteObservver4 = new Observer('concreteObservver4');

        // 具体的目标
        const concreteSuject1 = new Suject();
        const concreteSuject2 = new Suject();

        // 具体的对应关系
        concreteSuject1.addObserver(concreteObservver1);
        concreteSuject1.addObserver(concreteObservver2);

        // 具体的对应关系
        concreteSuject2.addObserver(concreteObservver3);
        concreteSuject2.addObserver(concreteObservver4);

        const data = { name: '萌萌哒草头将军', age: 18 }

        // 当data的name属性变化，对应的观察者concreteObservver1、
        // concreteObservver2就会被广播事件通知，从而更新
        Object.defineProperty(data, 'name', {
            get: () => this.name,
            set: (newValue) => {
                concreteSuject1.notify();
                this.name = newValue;
            }
        })

        // 当data的age属性变化，对应的观察者concreteObservver3、
        // concreteObservver4就会被广播事件通知，从而更新
        Object.defineProperty(data, 'age', {
            get: () => this.age,
            set: (newValue) => {
                concreteSuject2.notify();
                this.age = newValue;
            }
        })

        data.name = 'mmdctjj'
        // 我是： concreteObservver1 我知道我该更新了
        // 我是： concreteObservver2 我知道我该更新了
        data.age = 18
// 我是： concreteObservver3 我知道我该更新了
// 我是： concreteObservver4 我知道我该更新了
// 年轻时最珍贵的就是时间，依托时间完成目标
// 每周7*24，每天24，睡觉8个小时，上班8小时，通勤1个小时，吃饭2小时，剩下5小时
// 早上9.00-5.30 6.00-10.30 10.30-6.30 6.30-8.30
// 6.30-10.00 6.30-8.30 11.30-1.00
// 历史和前端和视频号
// tom张历史见解,当年明月历史见解,大佬们的历史见解分享
// 台球经典比赛视频,台球信息收集表格和结果表格
// tom张的货 

// 生命是一种感觉,每天活着是一种感觉,活着可能快乐,或者疲惫,或者无聊,或者充实,或者悲伤
// 每天都有不同的感觉,每天都有不同的生活,每天都有不同的人生
// 如果想每天快乐,那么就要每天做一些让自己快乐的事情
// 如果想每天充实,那么就要每天做一些让自己充实的事情
// 提高认知,有利于做出更好的决策,有利于提高生活质量,有利于提高工作效率
// 人生是一场和时间赛跑的游戏,看得远些,才知道时间真的不能够浪费,去做一些有意义的事情,让自己快乐的事情就好
    </script>
</body>

</html>